import { ElMessage, ElMessageBox } from 'element-plus'
import router from '@/router'
import auth from './auth'

/**
 * 权限管理工具类
 * 专门处理403权限不足的情况
 */
const permission = {
  /**
   * 处理403权限不足错误
   * @param {Object} error - 错误对象
   * @param {Object} options - 配置选项
   */
  handlePermissionDenied(error, options = {}) {
    const { 
      showMessage = true, 
      showBox = false, 
      redirectTo = null,
      customMessage = null 
    } = options

    // 获取错误信息
    let message = customMessage
    if (!message && error.response && error.response.data) {
      const data = error.response.data
      if (data.message) {
        message = data.message
      } else if (data.data && data.data.RequiredPermission) {
        message = `权限不足，需要 '${data.data.RequiredPermission}' 权限才能执行此操作`
      } else {
        message = '权限不足，无法访问此功能'
      }
    }

    if (!message) {
      message = '权限不足，无法访问此功能'
    }

    // 显示错误消息
    if (showMessage) {
      ElMessage.warning(message)
    }

    // 显示错误弹框
    if (showBox) {
      ElMessageBox.alert(
        message + '\n\n请联系管理员获取相应权限',
        '权限不足',
        {
          confirmButtonText: '确定',
          type: 'warning',
          callback: () => {
            if (redirectTo) {
              router.push(redirectTo)
            }
          }
        }
      )
    }

    // 记录权限错误日志
    console.warn('权限不足错误:', {
      url: error.config?.url,
      method: error.config?.method,
      status: error.response?.status,
      message: message,
      timestamp: new Date().toISOString()
    })
  },

  /**
   * 检查用户是否有指定权限
   * @param {string} permissionCode - 权限代码
   * @returns {boolean} - 是否有权限
   */
  hasPermission(permissionCode) {
    if (!permissionCode) {
      return true
    }

    const userInfo = localStorage.getItem('userInfo')
    if (!userInfo) {
      return false
    }

    try {
      const user = JSON.parse(userInfo)
      const userPermissions = user.permissions || []
      return userPermissions.includes(permissionCode)
    } catch (error) {
      console.error('解析用户权限信息失败:', error)
      return false
    }
  },

  /**
   * 检查用户是否有任意一个权限
   * @param {Array} permissionCodes - 权限代码数组
   * @returns {boolean} - 是否有权限
   */
  hasAnyPermission(permissionCodes) {
    if (!permissionCodes || permissionCodes.length === 0) {
      return true
    }

    return permissionCodes.some(code => this.hasPermission(code))
  },

  /**
   * 检查用户是否有所有权限
   * @param {Array} permissionCodes - 权限代码数组
   * @returns {boolean} - 是否有权限
   */
  hasAllPermissions(permissionCodes) {
    if (!permissionCodes || permissionCodes.length === 0) {
      return true
    }

    return permissionCodes.every(code => this.hasPermission(code))
  },

  /**
   * 获取用户所有权限
   * @returns {Array} - 权限代码数组
   */
  getUserPermissions() {
    const userInfo = localStorage.getItem('userInfo')
    if (!userInfo) {
      return []
    }

    try {
      const user = JSON.parse(userInfo)
      return user.permissions || []
    } catch (error) {
      console.error('解析用户权限信息失败:', error)
      return []
    }
  },

  /**
   * 显示权限不足提示
   * @param {string} operation - 操作名称
   */
  showPermissionDeniedMessage(operation = '执行此操作') {
    ElMessage.warning(`您没有权限${operation}，请联系管理员`)
  },

  /**
   * 权限不足时隐藏元素
   * @param {HTMLElement} element - 要隐藏的元素
   */
  hideElement(element) {
    if (element) {
      element.style.display = 'none'
    }
  },

  /**
   * 权限不足时禁用元素
   * @param {HTMLElement} element - 要禁用的元素
   */
  disableElement(element) {
    if (element) {
      element.disabled = true
      element.style.opacity = '0.5'
      element.style.cursor = 'not-allowed'
    }
  },

  /**
   * 创建权限检查的Vue指令
   * @param {string} permissionCode - 权限代码
   * @param {string} action - 动作类型 ('hide' | 'disable')
   */
  createPermissionDirective(permissionCode, action = 'hide') {
    return {
      mounted(el) {
        if (!permissionCode) return

        if (!this.hasPermission(permissionCode)) {
          if (action === 'hide') {
            this.hideElement(el)
          } else if (action === 'disable') {
            this.disableElement(el)
          }
        }
      },
      updated(el) {
        if (!permissionCode) return

        if (!this.hasPermission(permissionCode)) {
          if (action === 'hide') {
            this.hideElement(el)
          } else if (action === 'disable') {
            this.disableElement(el)
          }
        } else {
          if (action === 'hide') {
            el.style.display = ''
          } else if (action === 'disable') {
            el.disabled = false
            el.style.opacity = ''
            el.style.cursor = ''
          }
        }
      }
    }
  }
}

export default permission 